home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / scripts / kconfig / expr.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  4.9 KB  |  203 lines

  1. /*
  2.  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
  3.  * Released under the terms of the GNU GPL v2.0.
  4.  */
  5.  
  6. #ifndef EXPR_H
  7. #define EXPR_H
  8.  
  9. #ifdef __cplusplus
  10. extern "C" {
  11. #endif
  12.  
  13. #include <stdio.h>
  14. #ifndef __cplusplus
  15. #include <stdbool.h>
  16. #endif
  17.  
  18. struct file {
  19.     struct file *next;
  20.     struct file *parent;
  21.     char *name;
  22.     int lineno;
  23.     int flags;
  24. };
  25.  
  26. #define FILE_BUSY        0x0001
  27. #define FILE_SCANNED        0x0002
  28.  
  29. typedef enum tristate {
  30.     no, mod, yes
  31. } tristate;
  32.  
  33. enum expr_type {
  34.     E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_LIST, E_SYMBOL, E_RANGE
  35. };
  36.  
  37. union expr_data {
  38.     struct expr *expr;
  39.     struct symbol *sym;
  40. };
  41.  
  42. struct expr {
  43.     enum expr_type type;
  44.     union expr_data left, right;
  45. };
  46.  
  47. #define EXPR_OR(dep1, dep2)    (((dep1)>(dep2))?(dep1):(dep2))
  48. #define EXPR_AND(dep1, dep2)    (((dep1)<(dep2))?(dep1):(dep2))
  49. #define EXPR_NOT(dep)        (2-(dep))
  50.  
  51. #define expr_list_for_each_sym(l, e, s) \
  52.     for (e = (l); e && (s = e->right.sym); e = e->left.expr)
  53.  
  54. struct expr_value {
  55.     struct expr *expr;
  56.     tristate tri;
  57. };
  58.  
  59. struct symbol_value {
  60.     void *val;
  61.     tristate tri;
  62. };
  63.  
  64. enum symbol_type {
  65.     S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
  66. };
  67.  
  68. enum {
  69.     S_DEF_USER,        /* main user value */
  70.     S_DEF_AUTO,
  71. };
  72.  
  73. struct symbol {
  74.     struct symbol *next;
  75.     char *name;
  76.     enum symbol_type type;
  77.     struct symbol_value curr;
  78.     struct symbol_value def[4];
  79.     tristate visible;
  80.     int flags;
  81.     struct property *prop;
  82.     struct expr_value rev_dep;
  83. };
  84.  
  85. #define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
  86.  
  87. #define SYMBOL_CONST        0x0001
  88. #define SYMBOL_CHECK        0x0008
  89. #define SYMBOL_CHOICE        0x0010
  90. #define SYMBOL_CHOICEVAL    0x0020
  91. #define SYMBOL_VALID        0x0080
  92. #define SYMBOL_OPTIONAL        0x0100
  93. #define SYMBOL_WRITE        0x0200
  94. #define SYMBOL_CHANGED        0x0400
  95. #define SYMBOL_AUTO        0x1000
  96. #define SYMBOL_CHECKED        0x2000
  97. #define SYMBOL_WARNED        0x8000
  98. #define SYMBOL_DEF        0x10000
  99. #define SYMBOL_DEF_USER        0x10000
  100. #define SYMBOL_DEF_AUTO        0x20000
  101. #define SYMBOL_DEF3        0x40000
  102. #define SYMBOL_DEF4        0x80000
  103.  
  104. #define SYMBOL_MAXLENGTH    256
  105. #define SYMBOL_HASHSIZE        257
  106. #define SYMBOL_HASHMASK        0xff
  107.  
  108. enum prop_type {
  109.     P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE,
  110.     P_SELECT, P_RANGE, P_ENV
  111. };
  112.  
  113. struct property {
  114.     struct property *next;
  115.     struct symbol *sym;
  116.     enum prop_type type;
  117.     const char *text;
  118.     struct expr_value visible;
  119.     struct expr *expr;
  120.     struct menu *menu;
  121.     struct file *file;
  122.     int lineno;
  123. };
  124.  
  125. #define for_all_properties(sym, st, tok) \
  126.     for (st = sym->prop; st; st = st->next) \
  127.         if (st->type == (tok))
  128. #define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
  129. #define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
  130. #define for_all_prompts(sym, st) \
  131.     for (st = sym->prop; st; st = st->next) \
  132.         if (st->text)
  133.  
  134. struct menu {
  135.     struct menu *next;
  136.     struct menu *parent;
  137.     struct menu *list;
  138.     struct symbol *sym;
  139.     struct property *prompt;
  140.     struct expr *dep;
  141.     unsigned int flags;
  142.     char *help;
  143.     struct file *file;
  144.     int lineno;
  145.     void *data;
  146. };
  147.  
  148. #define MENU_CHANGED        0x0001
  149. #define MENU_ROOT        0x0002
  150.  
  151. #ifndef SWIG
  152.  
  153. extern struct file *file_list;
  154. extern struct file *current_file;
  155. struct file *lookup_file(const char *name);
  156.  
  157. extern struct symbol symbol_yes, symbol_no, symbol_mod;
  158. extern struct symbol *modules_sym;
  159. extern struct symbol *sym_defconfig_list;
  160. extern int cdebug;
  161. struct expr *expr_alloc_symbol(struct symbol *sym);
  162. struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
  163. struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
  164. struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
  165. struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
  166. struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
  167. struct expr *expr_copy(struct expr *org);
  168. void expr_free(struct expr *e);
  169. int expr_eq(struct expr *e1, struct expr *e2);
  170. void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
  171. tristate expr_calc_value(struct expr *e);
  172. struct expr *expr_eliminate_yn(struct expr *e);
  173. struct expr *expr_trans_bool(struct expr *e);
  174. struct expr *expr_eliminate_dups(struct expr *e);
  175. struct expr *expr_transform(struct expr *e);
  176. int expr_contains_symbol(struct expr *dep, struct symbol *sym);
  177. bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
  178. struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
  179. struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
  180. void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
  181. struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
  182.  
  183. void expr_fprint(struct expr *e, FILE *out);
  184. struct gstr; /* forward */
  185. void expr_gstr_print(struct expr *e, struct gstr *gs);
  186.  
  187. static inline int expr_is_yes(struct expr *e)
  188. {
  189.     return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
  190. }
  191.  
  192. static inline int expr_is_no(struct expr *e)
  193. {
  194.     return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
  195. }
  196. #endif
  197.  
  198. #ifdef __cplusplus
  199. }
  200. #endif
  201.  
  202. #endif /* EXPR_H */
  203.